package core.logic.dataAccess;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import javax.swing.JOptionPane;

import core.logic.services.utilServices.ConnectionService;
import core.models.dataModels.VerwijderPersoneelModel;
//import core.models.dataModels.VerwijderPersoneelModel;
import core.models.dataModels.createModels.ToevoegenPersoneelModel;
import core.models.dataModels.searchModels.ZoekGegVoorBookingModel;
import core.models.dataModels.searchModels.ZoekPersoneelModel;

import java.util.ArrayList; //Wijnen David [c1026300] 2013-11-29
import java.util.Date;

import core.models.domainModel.Adres;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.Personeel;//Wijnen David [c1026300] 2013-11-29
import core.models.domainModel.PersoneelsType;
import core.models.domainModel.Persoon;
import core.models.domainModel.Vlucht;


public class PersoneelDAO
{	
	public static int insertPersoneel(ToevoegenPersoneelModel model)
	{		
		int id = 0;
		ResultSet key;
		String sql = "INSERT INTO Personeel VALUES (?,?,?,?,?)";
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
			pst.setInt(1, model.getPersoonId());
			pst.setString(2, model.get_personeelsNummer());
			pst.setString(3, model.get_personeelType());
			pst.setInt(4, model.get_eigenaar().getEigenaarID());
			pst.setString(5, "");
			
			pst.executeUpdate();
			key = pst.getGeneratedKeys();
			while(key.next())
			{
				id = key.getInt(1);				
			}					
		}
		catch(SQLException ex)
		{
			JOptionPane.showMessageDialog(null, "Foutje");
		}
		return id;
	}
	
	public static int getPersoneelId(ToevoegenPersoneelModel model)
	{
		int id = 0;
		String sql = "SELECT * FROM Personeel WHERE Personeel.PersoonId = ?";
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql)	;
			pst.setInt(1, model.getPersoonId());
			
			ResultSet rs = pst.executeQuery();
			while(rs.next())
			{
				id = rs.getInt("PersoonId");
			}
		}
		catch(SQLException ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());
		}
		return id;		
	}

	//Lieven 29/11 --> dynamic prepared statement om personeel te zoeken.
	public static ArrayList<Personeel> getPersoneelByModel(ZoekPersoneelModel model){
		ArrayList<Personeel> lijst = new ArrayList<Personeel>();

		String sql = "SELECT DISTINCT * FROM Personeel, Persoon WHERE Personeel.Persoonid = Persoon.Persoonid"; 
		
		if(model.getSelectedEigenaar().getEigenaarID() > 0){
			sql = sql +  " AND Personeel.EigenaarId = ?";
		}
		if(model.getSelectedPersoneelsType().getCode() != null && model.getSelectedPersoneelsType().getCode() != ""){
			sql = sql + " AND ";
			sql = sql + "Personeel.PersoneelType = ?";
		}
		if(model.getPersoneelsnummer() != null && model.getPersoneelsnummer().length() > 0){

			sql = sql + " AND ";
			sql = sql + "Personeel.PersoneelsNummer = ?";
		}
		if(model.getVoornaam() != null && model.getVoornaam().length()>0){

			sql = sql + " AND ";
			sql = sql + "Persoon.Voornaam = ?";
		}
		if(model.getFamNaam() != null && model.getFamNaam().length()>0){

			sql = sql + " AND ";
			sql = sql + "Persoon.Naam = ?";
		}
				
		try{
			int i = 0;
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			if(model.getSelectedEigenaar().getEigenaarID() > 0){pst.setInt(i+1, model.getSelectedEigenaar().getEigenaarID());i++;}
			if(model.getSelectedPersoneelsType().getCode() != null && model.getSelectedPersoneelsType().getCode() != ""){pst.setString(i+1, model.getSelectedPersoneelsType().getCode());i++;}
			if(model.getPersoneelsnummer() != null && model.getPersoneelsnummer().length() > 0){pst.setString(i+1, model.getPersoneelsnummer());i++;}
			if(model.getVoornaam() != null && model.getVoornaam().length()>0){pst.setString(i+1, model.getVoornaam()); i++;}
			if(model.getFamNaam() != null && model.getFamNaam().length()>0){pst.setString(i+1, model.getFamNaam()); i++;}
			
			ResultSet rs = pst.executeQuery();
			while(rs.next()){
				Persoon pers = new Persoon();
				pers.setNaam(rs.getString("Naam"));
				pers.setVoornaam(rs.getString("voornaam"));
				
			lijst.add(new Personeel(pers, rs.getString("PersoneelsNummer"), new PersoneelsType(rs.getString("PersoneelType"), null), null));
			}
			
			return lijst;
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		return lijst;
	}
	//@Author: Wijnen David [c1026300] 2013-12-14
	//-------------------------------------------
	public static ArrayList<Personeel> getPersoneelForOverviewList()
	{
		ArrayList<Personeel> lijstPersoneel = new ArrayList<Personeel>();
		
		String sql = "SELECT DISTINCT * "
				+	 "FROM Personeel, Persoon "
				+	 "WHERE Personeel.Persoonid = Persoon.Persoonid "
				+	 "AND (Personeel.Einddatum IS NULL OR Personeel.Einddatum = '')";

		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			ResultSet rs = pst.executeQuery();
			
			while(rs.next())
			{
				Persoon persoon = new Persoon();
				persoon.setPersoonId(rs.getInt("Persoonid"));
				persoon.setNaam(rs.getString("Naam"));
				persoon.setVoornaam(rs.getString("voornaam"));
				
				Personeel personeel = new Personeel();
				personeel.set_personeelId(rs.getInt("PersoneelId"));
				personeel.set_persoonId(persoon);
				personeel.set_personeelsNummer(rs.getString("PersoneelsNummer"));
				personeel.set_personeelType(new PersoneelsType(rs.getString("PersoneelType"), null));
						
				lijstPersoneel.add(personeel);
						
				//		(persoon, rs.getString("PersoneelsNummer"), new PersoneelsType(rs.getString("PersoneelType"), null), null);
				//personeel.set
				//lijstPersoneel.add(new Personeel(persoon, rs.getString("PersoneelsNummer"), new PersoneelsType(rs.getString("PersoneelType"), null), null));
			}
		}
		catch(Exception ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		return lijstPersoneel;
	}
	
	//@Author: Wijnen David [c1026300] 2013-11-29 
	//-------------------------------------------
	public static ArrayList<Personeel> getPersoneelAll()
	{
		ArrayList<Personeel> lijstPersoneel = new ArrayList<Personeel>();
		
		//enkel de gegevens ophalen waarvan de datum "" (leeg) is, of NULL
		String sql = "SELECT p.PersoneelId, p.PersoonId, p.PersoneelsNummer, p.PersoneelType, p.EigenaarId, p.Einddatum FROM Personeel p WHERE p.Einddatum IS NULL OR p.Einddatum = ''";
				
		try{		
			Statement st = ConnectionService.getConnection().createStatement();
			ResultSet rs = st.executeQuery(sql);
			
			//alle regels een voor een inlezen
			while(rs.next())
			{	
				//de toString() van personeel is een html.
				//als het personeelstype leeg is, krijgt men geen gegevens in de overzichtslijst
				PersoneelsType pt = new PersoneelsType("1", "P");
				
				Personeel p = new Personeel(
						rs.getInt("PersoneelId"),
						PersoonDAO.getPersoonById(rs.getInt("PersoonId")),
						rs.getString("PersoneelsNummer"),
						pt,
						null,
						rs.getString("Einddatum"));
				
				lijstPersoneel.add(p);				
			}
			st.close();
		}
		catch(SQLException ex){
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		return lijstPersoneel;
	}
	
	//@Author: Pieter Gielen [c1025696] 2013-12-09 
	//-------------------------------------------
	public static ArrayList<Personeel> PersoneelOpVlucht(ZoekGegVoorBookingModel model)
	{
		ArrayList<Personeel> lijstPersoneel = new ArrayList<Personeel>();
	
		//voorbeeld
//		String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = ?";
//		PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL);
//		preparedStatement.setInt(1, 1001);
//		ResultSet rs = preparedStatement.executeQuery(selectSQL );
//		while (rs.next()) {
//			String userid = rs.getString("USER_ID");
//			String username = rs.getString("USERNAME");	
//		}
		
		
		
		//enkel de gegevens ophalen waarvan de datum "" (leeg) is, of NULL en die op een bepaalde vlucht zit
		String sql = "SELECT dbo.Personeel_Vlucht.PersoneelId, dbo.Personeel_Vlucht.VluchtId, dbo.Personeel.PersoonId, dbo.Personeel.PersoneelsNummer, dbo.Personeel.PersoneelType, dbo.Persoon.Naam, dbo.Persoon.Voornaam, dbo.Persoon.AdresId, dbo.Persoon.Geboortedatum, dbo.Personeel.Einddatum, dbo.Personeel.PersoneelId AS Expr1, dbo.Personeel_Vlucht.comboId"
					+" FROM dbo.Personeel INNER JOIN "+
                         "dbo.Personeel_Vlucht ON dbo.Personeel.PersoneelId = dbo.Personeel_Vlucht.PersoneelId INNER JOIN "+
                         " dbo.Persoon ON dbo.Personeel.PersoonId = dbo.Persoon.PersoonId "+
                     " WHERE dbo.Personeel_Vlucht.VluchtId = ? AND dbo.Personeel.Einddatum IS NULL OR dbo.Personeel.Einddatum = '' ";
		try{
			
//			Statement statement = ConnectionService.getConnection().createStatement();
//			((PreparedStatement) statement).setInt(1,((Vlucht) model.enkeleVlucht).getVluchtId());

			PreparedStatement preparedStatement = ConnectionService.getConnection().prepareStatement(sql);
			preparedStatement.setInt(1, ((Vlucht) model.enkeleVlucht).getVluchtId());
			
			
			ResultSet rs = preparedStatement.executeQuery();
			
			//alle regels een voor een inlezen
			while(rs.next())
			{	
			
	
			//	int personeelId, Persoon persoon, String personeelNummer, PersoneelsType personeelType, Eigenaar eigenaar, String eindDatum
				
				
				Personeel Pers = new Personeel(rs.getInt("PersoneelId"),new Persoon(rs.getInt("PersoonId"), rs.getString("Naam"), rs.getString("Voornaam")),rs.getString("PersoneelsNummer"),new PersoneelsType(rs.getString("PersoneelType"), rs.getString("PersoneelType")),null,rs.getString("Einddatum") );

//				model.enkelPersoneel.set_personeelId(rs.getInt("PersoneelId"));
//				//model.enkelPersoneel.set_persoonId(rs.getInt("PersoonId");
//				model.enkelPersoneel.set_persoonId(new Persoon(rs.getInt("PersoonId"), rs.getString("Naam"), rs.getString("Voornaam")) );
//				model.enkelPersoneel.set_personeelsNummer(rs.getString("PersoneelsNummer"));
//				model.enkelPersoneel.set_personeelType(new PersoneelsType(rs.getString("PersoneelType"), rs.getString("PersoneelType")) );
//				model.enkelPersoneel.set_eindDatum(rs.getString("Einddatum"));
				
				
				lijstPersoneel.add(Pers);				
			}
		}
		catch(SQLException ex){
			JOptionPane.showMessageDialog(null, ex.getMessage());
		}
		
		return lijstPersoneel;
	}
	//@Author:Pieter Gielen [c1025696] 2013-12-11
		//-------------------------------------------
		public static int deleteBemanningVanVlucht(ZoekGegVoorBookingModel model)
		{
			//OPMERKING:
			//----------
			//Het record zal niet werkelijk verwijderd worden.
			//in de plaats zal men de einddatum invullen.
			int ok = 0;
			
			int lviPersoneelID=-1;
			int lviVluchtID=-1;
			
			lviPersoneelID = model.enkelPersoneel.get_personeelId();
			lviVluchtID = model.enkeleVlucht.getVluchtId();
			
			try {
					//TODO
				
				//sql string samenstellen
				String sql = "DELETE FROM Personeel_Vlucht WHERE PersoneelId=? and VluchtId=?";
				
				//parameters
				PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
				statement.setInt(1, lviPersoneelID);
				statement.setInt(2, lviVluchtID);
				
				//uitvoeren en status terug opvangen
				ok = statement.executeUpdate();

			} 
			catch(SQLException ex) {
				ex.printStackTrace();
			}
			return ok;
		}
	
	//@Author: Wijnen David [c1026300] 2013-12-08 
	//-------------------------------------------
	public static int deletePersoneel(VerwijderPersoneelModel model)
	{
		//OPMERKING:
		//----------
		//Het record zal niet werkelijk verwijderd worden.
		//in de plaats zal men de einddatum invullen.
		int ok = 0;
		
		try {
			//huidige datum op halen en formaat instellen
			DateFormat datumFormaat = new SimpleDateFormat("dd/MM/yyyy");
			Date huidigeDatum = new Date();
			String eindDatum = datumFormaat.format(huidigeDatum);//datum van vandaag
							
			//sql string samenstellen
			String sql = "UPDATE Personeel "
					+    "SET Einddatum = ? "
					+    "WHERE PersoneelId = ?";
			
			//parrameters
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			statement.setString(1, eindDatum);
			statement.setInt(2, model.getVerwijderPersoneel().get_personeelId());
			
			//uitvoeren en status terug opvangen
			ok = statement.executeUpdate();

		} 
		catch(SQLException ex) {
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		return ok;
	}
	
	//@Author: Wijnen David [c1026300] 2013-12-12 
	//-------------------------------------------
	public static Personeel getPersoneelByID(int id)
	{
		Personeel personeel = null;
		Persoon persoon = null;
		Eigenaar eigenaar = null;
		
		String sql = "SELECT DISTINCT * "
				+ 	 "FROM Personeel "
				+	 "WHERE PersoneelId = ?";
		
		try
		{		
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql)	;
			pst.setInt(1, id);
			ResultSet rs = pst.executeQuery();
			
			
			while(rs.next())
			{
				persoon = PersoonDAO.getPersoonById(rs.getInt("PersoonId"));
				eigenaar = EigenaarDAO.getEigenaarByID(rs.getInt("EigenaarId"));
						
				personeel = new Personeel(
						rs.getInt("PersoneelId"),
						persoon,
						rs.getString("PersoneelsNummer"),
						new PersoneelsType(rs.getString("PersoneelType"), null),
						eigenaar,
						rs.getString("Einddatum"));	
				
			}
		}
		catch(SQLException ex) {
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		return personeel;
	}
	
	// Bertels Nick c1019387
		public static ArrayList<Personeel> getPersoneelByType(int eigenaarId , String type)
		{
			ArrayList<Personeel> lijst = new ArrayList<Personeel>();
			String sql = "SELECT * FROM Personeel pl INNER JOIN Persoon pn ON (pl.PersoonId = pn.PersoonId) INNER JOIN Eigenaar e ON (pl.EigenaarId = e.EigenaarId) INNER JOIN Adres a ON (pn.AdresId = a.AdresId) WHERE pl.EigenaarId = ? AND pl.PersoneelType = ?";
			try{
				
				PreparedStatement prep= ConnectionService.getConnection().prepareStatement(sql);
				
				prep.setInt(1, eigenaarId);
				prep.setString(2, type);
				
				ResultSet rs = prep.executeQuery();
				
				while(rs.next()){
					
					
					//Adres
					Adres adr = new Adres();
					adr.set_adresId(rs.getInt("AdresId"));
					adr.setBus(rs.getString("Bus"));
					adr.setGemeente(rs.getString("Gemeente"));
					adr.setHuisnummer(rs.getInt("Huisnumer"));
					adr.setLand(rs.getString("Land"));
					adr.setPostcode(rs.getString("PostCode"));
					adr.setStaatProvincie(rs.getString("Staat_Provincie"));
					adr.setStraat(rs.getString("Straat"));
					
					
					// persoon
					Persoon per = new Persoon();
					per.setPersoonId(rs.getInt("PersoonId"));
					per.setNaam(rs.getString("Naam"));
					per.setVoornaam(rs.getString("Voornaam"));
					per.setAdres(adr);
					per.setGeboortedatum(rs.getString("Geboortedatum"));
					
					// personeelsType
					String naam;
					if (type == "P")
						naam = "Piloot";
					else
						naam = "Stuward";
					
					PersoneelsType py = new PersoneelsType(type,naam);
					
					
					// eigenaar
					Eigenaar eig = new Eigenaar();
					eig.setEigenaarID(eigenaarId);
					eig.setEigenaarsType(rs.getString("EigenaarsType"));
					//eig.setPersoonId(rs.getInt("PersoonId"));
					eig.setPersoon(per);
					eig.setAdresId(rs.getInt("AdresId"));
					eig.setMaatschappijNaam(rs.getString("MaatschappijNaam"));
					
					// personeel
					Personeel p = new Personeel();
					p.set_personeelId(rs.getInt("PersoneelId"));
					p.set_persoonId(per);
					p.set_personeelsNummer(rs.getString("PersoneelsNummer"));
					p.set_personeelType(py);
					p.set_eigenaarId(eig);
										
					lijst.add(p);
					
					
				}
				
			}
			catch(SQLException ex){
				ex.printStackTrace();
			}
			return lijst;
		}
		
		//@Author: Wijnen David [c1026300] 2013-12-14
		//-------------------------------------------
		public static int updatePersoneel(Personeel personeel)
		{
			int result = 0;
			
			String sql = "UPDATE Personeel " 
						 + "SET PersoneelsNummer = ?, "
						 + "PersoneelType = ?, "
						 + "EigenaarId = ? "
						 + "WHERE PersoneelId = ?;";
			try
			{
				PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
				pst.setString(1, personeel.get_personeelsNummer());
				pst.setString(2, personeel.get_personeelType().getCode());
				pst.setInt(3, personeel.get_eigenaarId().getEigenaarID());
				pst.setInt(4, personeel.get_personeelId());
				
				result = pst.executeUpdate();

			}
			catch(SQLException ex)
			{
				JOptionPane.showMessageDialog(null, ex.getMessage());
				ex.printStackTrace();
			}
			return result;
		}
}
